<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>learnFunction</title>
</head>

<body>
    <script>
        //声明函数
        // var fun1 = new Function();
        // function haha() {
        //     console.log('haha');
        // }
        // var myFun = function () {
        //     console.log('hahaha');
        // }
        // console.log(typeof myFun);

        // void使用
        // void()仅仅代表不返回任何值，但是括号内的表达式还要运行
        // javasript:void(0)该操作符指定要计算一个表达式但不返回值
        // 写一个死链接href = "javasript:void(0)";

        // 匿名函数
        // var nifun = function () {
        //     console.log("匿名函数");
        // }
        // nifun();

        // 回调函数
        // function fun(fu) {
        //     fu();
        // }
        // function fun1() {
        //     console.log("回调");
        // }
        // fun(fun1);
        // fun1();

        // 匿名函数的自我调用(沙箱函数)
        // var fun = function () {
        //     console.log("函数自我调用");
        // }();
        // **沙箱：就是与外界隔绝的一个环境，外界无法修改该环境内的任何信息（沙箱内的东西单独属于一个世界）**
        // (function () {
        //     console.log("沙箱");
        // })();


        // 递归函数(函数在函数体里调用自己)切记要设个出口，不能无限循环
        // var n = 0;
        // function fun() {
        //     console.log(111);
        //     n++;
        //     if (n > 10) {
        //         return 0;
        //     }
        //     fun();
        // }
        // fun();

        // Function构造函数
        // var fun = new Function('a', ' b', 'return a + b');
        // console.log(fun(1, 2));
        // function fun1(a, b) {
        //     return a + b;
        // }
        // console.log(fun1(1, 2));

        // es6参数默认值写法
        // function fun(a = 0, b = 0) {
        //     console.log(a + b);
        // }
        // fun(2);
        // fun(2, 3);


        // 计算：6+5+4+3+2+1
        // var num = 6;
        // var count = 0;
        // function abc() {
        //     count += num;
        //     num--;
        //     if (num == 0) {
        //         return;
        //     }
        //     abc();
        // }
        // abc();
        // console.log(count);

        // var f2;
        // function f1() {
        //     console.log(1);
        //     return function () {
        //         console.log(2);
        //     }
        // }
        // f2 = f1();
        // f2();


        // 全局方法(函数)
        // eval()方法 计算某个字符串，并执行其中js代码
        console.log(eval("3+3"));
        // escape()方法 对字符串编码
        var str = '11a罗建明'
        console.log(escape(str));
        // unescape() 解码
        console.log(unescape(str));


        // name为函数名，length为函数参数个数
        // function abc(a, b, c) {
        //     console.log(abc.name, abc.length);
        // }
        // abc();

        // arguments对象时js给我们提供的一个形式参数，它是一个数组
        // function abc() {
        //     console.log(arguments[0], arguments[1]);
        //     console.log(arguments);
        // }
        // abc(1, 2);


        //***函数在接受这个参数时，无论参数是什么数据类型，
        //***在传递时只会把这个参数在栈内存里面的值传递过去
        // var num = 100;
        // function fun(num) {
        //     num = 200;
        //     console.log(num);
        // }
        // fun(num);
        // console.log(num);

        // 同名参数使用最后一个值
        // function fun(a, a) {
        //     console.log(arguments)
        //     console.log(a);
        // }
        // fun(1, 2);

        // instanceof 用于判断一个变量是否是某个对象的实例
        // var obj = {
        //     name: 'luo',
        //     age: 18
        // };
        // console.log(obj instanceof Object);




        // ********闭包：能够读取其他函数（外部函数）变量的函数（内部函数）就是闭包。********   
        // function f1() {
        //     var num = 0;
        //     return {
        //         setter: function (param) {
        //             num = param;
        //         },
        //         getter: function () {
        //             return num;
        //         }
        //     }
        // }
        // var haha = f1();
        // console.log(haha.getter());
        // haha.setter(10)
        // console.log(haha.getter());
        // console.log(haha.getter());
        // haha.setter(100);
        // console.log(haha.getter());
        // 升级改进匿名函数自调用(模块化)
        // var f1 = (function () {
        //     var num = 0;
        //     return {
        //         setter: function (param) {
        //             num = param;
        //         },
        //         getter: function () {
        //             return num;
        //         }
        //     }
        // })();
        // f1.setter(100);
        // console.log(f1.getter());

        // this指向它最终的执行者
        var num = 0;
        function fun() {
            var num = 100;
            this.num = num;
            // console.log(this.num);
        }
        // fun();
        var obj = new fun();
        console.log(obj.num);


    </script>
    <script src="./learnFun.js"></script>
</body>

</html>